/**
 * @file bl6552.h
 * @brief 三相电能监测及分析专用芯片驱动
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2021-03-01
 * @copyright Copyright (c) 2021  烽火通信
 */
#ifndef __BL6552_H
#define __BL6552_H 
#include "project_config.h"

#if DRV_BL6552_EN
#include "bl6552_config.h"
#include "bsp_uart_v2.h"
#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"
#include "semphr.h"

#ifndef TYPEDEF_FLAOT_UNION
#define TYPEDEF_FLAOT_UNION
typedef union { uint8_t byte[4]; float value; } FLAOT_UNION;
#endif
#ifndef TYPEDEF_UINT32_UNION
#define TYPEDEF_UINT32_UNION
typedef union { uint8_t byte[4]; uint32_t value; } UINT32_UNION;
#endif
#ifndef TYPEDEF_INT32_UNION
#define TYPEDEF_INT32_UNION
typedef union { uint8_t byte[4]; int32_t value; } INT32_UNION;
#endif
#ifndef TYPEDEF_UINT16_UNION
#define TYPEDEF_UINT16_UNION
typedef union { uint8_t byte[2]; uint16_t value; } UINT16_UNION;
#endif
#ifndef TYPEDEF_INT16_UNION
#define TYPEDEF_INT16_UNION
typedef union { uint8_t byte[2]; int16_t value; } INT16_UNION;
#endif

/* BL6552 电参量寄存器  */
#define Addr_IC_WAVE            0x02    ///< C 相电流波形寄存器
#define Addr_IB_WAVE            0x03    ///< B 相电流波形寄存器
#define	Addr_IA_WAVE            0x04    ///< A 相电流波形寄存器
#define	Addr_IN_WAVE            0x05    ///< 零线电流波形寄存器
#define	Addr_VA_WAVE            0x08    ///< A 相电压波形寄存器
#define	Addr_VB_WAVE            0x09    ///< B 相电压波形寄存器
#define	Addr_VC_WAVE            0x0A    ///< C 相电压波形寄存器

#define Addr_IC_RMS             0x0D    ///< C 相电流有效值寄存器
#define Addr_IB_RMS             0x0E    ///< B 相电流有效值寄存器
#define Addr_IA_RMS             0x0F    ///< A 相电流有效值寄存器
#define Addr_IN_RMS             0x10    ///< 零线电流有效值寄存器
#define Addr_VA_RMS             0x13    ///< A 相电压有效值寄存器
#define Addr_VB_RMS             0x14    ///< B 相电压有效值寄存器
#define Addr_VC_RMS             0x15    ///< C 相电压有效值寄存器

#define Addr_IC_FAST_RMS        0x18    ///< C 相电流快速有效值寄存器
#define Addr_IB_FAST_RMS        0x19    ///< B 相电流快速有效值寄存器
#define Addr_IA_FAST_RMS        0x1A    ///< A 相电流快速有效值寄存器
#define Addr_IN_FAST_RMS        0x1B    ///< 零线电流快速有效值寄存器
#define Addr_VA_FAST_RMS        0x1E    ///< A 相电压快速有效值寄存器
#define Addr_VB_FAST_RMS        0x1F    ///< B 相电压快速有效值寄存器
#define Addr_VC_FAST_RMS        0x20    ///< C 相电压快速有效值寄存器

#define Addr_WATT_A             0x22    ///< A 相有功功率寄存器
#define Addr_WATT_B             0x23    ///< B 相有功功率寄存器
#define Addr_WATT_C             0x24    ///< C 相有功功率寄存器
#define Addr_WATT               0x25    ///< 合相有功功率寄存器
#define Addr_VA_A               0x26    ///< A 相视在功率寄存器
#define Addr_VA_B               0x27    ///< B 相视在功率寄存器
#define Addr_VA_C               0x28    ///< C 相视在功率寄存器
#define Addr_VA                 0x29    ///< 合相视在功率寄存器
#define Addr_FVAR_A             0x2A    ///< A 相（基波）无功功率寄存器
#define Addr_FVAR_B             0x2B    ///< B 相（基波）无功功率寄存器
#define Addr_FVAR_C             0x2C    ///< C 相（基波）无功功率寄存器
#define Addr_FVAR               0x2D    ///< 合相（基波）无功功率寄存器

#define Addr_PERIOD             0x2E    ///< 线电压频率周期寄存器（可选通道）
#define Addr_CF_A_CNT           0x2F    ///< A 相有功脉冲计数
#define Addr_CF_B_CNT           0x30    ///< B 相有功脉冲计数
#define Addr_CF_C_CNT           0x31    ///< C 相有功脉冲计数
#define Addr_CF_CNT             0x32    ///< 合相有功脉冲计数
#define Addr_CFP_A_CNT          0x33    ///< A 相正有功脉冲计数
#define Addr_CFP_B_CNT          0x34    ///< B 相正有功脉冲计数
#define Addr_CFP_C_CNT          0x35    ///< C 相正有功脉冲计数
#define Addr_CFP_CNT            0x36    ///< 合相正有功脉冲计数
#define Addr_CFN_A_CNT          0x37    ///< A 相负有功脉冲计数
#define Addr_CFN_B_CNT          0x38    ///< B 相负有功脉冲计数
#define Addr_CFN_C_CNT          0x39    ///< C 相负有功脉冲计数
#define Addr_CFN_CNT            0x3A    ///< 合相负有功脉冲计数
#define Addr_CFQ_A_CNT          0x3B    ///< A 相无功脉冲计数
#define Addr_CFQ_B_CNT          0x3C    ///< B 相无功脉冲计数
#define Addr_CFQ_C_CNT          0x3D    ///< C 相无功脉冲计数
#define Addr_CFQ_CNT            0x3E    ///< 合相无功脉冲计数
#define Addr_CFQ1_CNT           0x3F    ///< 第一象限无功脉冲计数
#define Addr_CFQ2_CNT           0x40    ///< 第二象限无功脉冲计数
#define Addr_CFQ3_CNT           0x41    ///< 第三象限无功脉冲计数
#define Addr_CFQ4_CNT           0x42    ///< 第四象限无功脉冲计数
#define Addr_CFS_A_CNT          0x43    ///< A 相视在脉冲计数
#define Addr_CFS_B_CNT          0x44    ///< B 相视在脉冲计数
#define Addr_CFS_C_CNT          0x45    ///< C 相视在脉冲计数
#define Addr_CFS_CNT            0x46    ///< 合相视在脉冲计数

#define Addr_PF_A               0x47    ///< A 相功率因子寄存器
#define Addr_PF_B               0x48    ///< B 相功率因子寄存器
#define Addr_PF_C               0x49    ///< C 相功率因子寄存器
#define Addr_PF                 0x4A    ///< 合相功率因子寄存器
#define Addr_LINE_WATTHR        0x4B    ///< 线周期累计有功能量寄存器
#define Addr_LINE_VARHR         0x4C    ///< 线周期累计无功能量寄存器
#define Addr_SIGN               0x4D    ///< CF 符号位

#define Addr_ANGLE_AB           0x4E    ///< 电压 A 相与电压 B 相的波形夹角寄存器
#define Addr_ANGLE_BC           0x4F    ///< 电压 B 相与电压 C 相的波形夹角寄存器
#define Addr_ANGLE_AC           0x50    ///< 电压 A 相与电压 C 相的波形夹角寄存器
#define Addr_ANGLE_A            0x51    ///< A 相电压与电流波形夹角波形寄存器
#define Addr_ANGLE_B            0x52    ///< B 相电压与电流波形夹角寄存器
#define Addr_ANGLE_C            0x53    ///< C 相电压与电流波形夹角寄存器

#define Addr_STATUS1            0x54    ///< 中断状态寄存器 1
#define Addr_STATUS2            0x55    ///< 中断状态寄存器 2

#define Addr_I_SUM              0x57    ///< 三相电流瞬时波形和
#define Addr_I_SUM_RMS          0x58    ///< 三相电流瞬时波形和的有效值
#define Addr_I_SUM_FAST_RMS     0x59    ///< 三相电流瞬时波形和的快速有效值
#define Addr_VAR_A              0x5A    ///< A 相（全波）无功功率寄存器
#define Addr_VAR_B              0x5B    ///< B 相（全波）无功功率寄存器
#define Addr_VAR_C              0x5C    ///< C 相（全波）无功功率寄存器
#define Addr_VAR                0x5D    ///< 合相（全波）无功功率寄存器
#define Addr_TPS1               0x5E    ///< 内部温度值寄存器


/* 校表寄存器1 */
#define Addr_GAIN1              0x60    ///< 通道 PGA 增益电流调整寄存器
#define Addr_GAIN2              0x61    ///< 通道 PGA 增益电压调整寄存器
#define Addr_IRMS_P1            0x62    ///< 角差分段点定义 P1
#define Addr_IRMS_P2            0x63    ///< 角差分段点定义 P2
#define Addr_IA_PHCAL           0x64    ///< A 相电流通道角差校正寄存器
#define Addr_IB_PHCAL           0x65    ///< B 相电流通道角差校正寄存器
#define Addr_IC_PHCAL           0x66    ///< C 相电流通道角差校正寄存器
#define Addr_VA_PHCAL           0x67    ///< A 相电压通道角差校正寄存器
#define Addr_VB_PHCAL           0x68    ///< B 相电压通道角差校正寄存器
#define Addr_VC_PHCAL           0x69    ///< C 相电压通道角差校正寄存器
#define Addr_VAR_PHCAL_I        0x6A    ///< 无功电流相位校正
#define Addr_VAR_PHCAL_V        0x6B    ///< 无功电压相位校正
#define Addr_IC_RMSGN           0x6D    ///< 电流 C 通道有效值增益调整寄存器
#define Addr_IB_RMSGN           0x6E    ///< 电流 B 通道有效值增益调整寄存器
#define Addr_IA_RMSGN           0x6F    ///< 电流 A 通道有效值增益调整寄存器
#define Addr_IN_RMSGN           0x70    ///< 电流 N 通道有效值增益调整寄存器
#define Addr_VA_RMSGN           0x73    ///< 电压 A 通道有效值增益调整寄存器
#define Addr_VB_RMSGN           0x74    ///< 电压 B 通道有效值增益调整寄存器
#define Addr_VC_RMSGN           0x75    ///< 电压 C 通道有效值增益调整寄存器
#define Addr_IC_RMSOS           0x78    ///< 电流 C 通道有效值偏置校正寄存器
#define Addr_IB_RMSOS           0x79    ///< 电流 B 通道有效值偏置校正寄存器
#define Addr_IA_RMSOS           0x7A    ///< 电流 A 通道有效值偏置校正寄存器
#define Addr_IN_RMSOS           0x7B    ///< 电流 N 通道有效值偏置校正寄存器
#define Addr_VA_RMSOS           0x7E    ///< 电压 A 通道有效值偏置校正寄存器
#define Addr_VB_RMSOS           0x7F    ///< 电压 B 通道有效值偏置校正寄存器
#define Addr_VC_RMSOS           0x80    ///< 电压 C 通道有效值偏置校正寄存器
#define Addr_WA_VAR_LOS_A       0x82    ///< 对应 A 相有功/无功小信号补偿寄存器
#define Addr_WA_VAR_LOS_B       0x83    ///< 对应 B 相有功/无功小信号补偿寄存器
#define Addr_WA_VAR_LOS_C       0x84    ///< 对应 C 相有功/无功小信号补偿寄存器
#define Addr_FVAR_LOS_A         0x85    ///< 对应无功功小信号补偿寄存器
#define Addr_FVAR_LOS_B         0x86    ///< 对应无功功小信号补偿寄存器
#define Addr_FVAR_LOS_C         0x87    ///< 对应无功功小信号补偿寄存器
#define Addr_VAR_WA_CREEP       0x88    ///< 无功/有功防潜动功率阈值寄存器
#define Addr_VAR_WA_CREEP2      0x89    ///< 合相无功/有功防潜动功率阈值寄存器
#define Addr_REVP_RMS_CREEP     0x8A    ///< 反向指示阈值/有效值小信号阈值寄存器
#define Addr_FAST_RMS_CTRL      0x8B    ///< 通道快速有效值寄存器刷新时间
#define Addr_I_V_PKLVL          0x8C    ///< 电流/电压峰值门限寄存器
#define Addr_ISUMLVL            0x8D    ///< 电流比较阈值寄存器
#define Addr_SAGCYC_ZXTOUT      0x8E    ///< 跌落线周期寄存器
#define Addr_SAGLVL_LINECYC     0x8F    ///< 跌落电压阈值寄存器
#define Addr_IN_PHCAL           0x90    ///< IN 相电流通道角差校正寄存器
#define Addr_ISUM_RMSGN         0x91    ///< 对应通道有效值增益调整寄存器
#define Addr_ISUM_RMSOS         0x92    ///< 对应通道有效值偏置校正寄存器
#define Addr_ADC_PD             0x93    ///< 7 个通道 ADC 的使能控制
#define Addr_TPS_CTRL           0x94    ///< 测温开关
#define Addr_MODE1              0x96    ///< 用户模式选择寄存器 1
#define Addr_MODE2              0x97    ///< 用户模式选择寄存器 2
#define Addr_MODE3              0x98    ///< 用户模式选择寄存器 3
#define Addr_MASK1              0x9A    ///< 中断屏蔽寄存器
#define Addr_MASK2              0x9B    ///< 中断屏蔽寄存器
#define Addr_RST_ENG            0x9D    ///< 能量清零设置寄存器
#define Addr_USR_WRPROT         0x9E    ///< 用户写保护设置寄存器
#define Addr_SOFT_RESET         0x9F    ///< 当输入为 5A5A5A 时，复位电参数寄存器；当输入为 55AA55 时，校表寄存器复位


/* 校表寄存器2 */
#define Addr_IC_CHGN            0xA1    ///< 电流 C 通道增益调整寄存器
#define Addr_IB_CHGN            0xA2    ///< 电流 B 通道增益调整寄存器
#define Addr_IA_CHGN            0xA3    ///< 电流 A 通道增益调整寄存器
#define Addr_IN_CHGN            0xA4    ///< 电流 N 通道增益调整寄存器
#define Addr_VA_CHGN            0xA7    ///< 电压 A 通道增益调整寄存器
#define Addr_VB_CHGN            0xA8    ///< 电压 B 通道增益调整寄存器
#define Addr_VC_CHGN            0xA9    ///< 电压 C 通道增益调整寄存器
#define Addr_IC_CHOS            0xAC    ///< 电流 C 通道偏置调整寄存器
#define Addr_IB_CHOS            0xAD    ///< 电流 B 通道偏置调整寄存器
#define Addr_IA_CHOS            0x9E    ///< 电流 A 通道偏置调整寄存器
#define Addr_IN_CHOS            0x9F    ///< 电流 N 通道偏置调整寄存器
#define Addr_VA_CHOS            0xB2    ///< 电压 A 通道偏置调整寄存器
#define Addr_VB_CHOS            0xB3    ///< 电压 B 通道偏置调整寄存器
#define Addr_VC_CHOS            0xB4    ///< 电压 C 通道偏置调整寄存器
#define Addr_WATTGN_A           0xB6    ///< A 相有功功率增益调整寄存器
#define Addr_WATTGN_B           0xB7    ///< B 相有功功率增益调整寄存器
#define Addr_WATTGN_C           0xB8    ///< C 相有功功率增益调整寄存器
#define Addr_VARGN_A            0xB9    ///< A 相无功功率增益调整寄存器
#define Addr_VARGN_B            0xBA    ///< B 相无功功率增益调整寄存器
#define Addr_VARGN_C            0xBB    ///< C 相无功功率增益调整寄存器
#define Addr_FVARGN_A           0xBC    ///< A 相基波无功功率增益调整寄存器
#define Addr_FVARGN_B           0xBD    ///< B 相基波无功功率增益调整寄存器
#define Addr_FVARGN_C           0xBE    ///< C 相基波无功功率增益调整寄存器
#define Addr_VAGN_A             0xBF    ///< A 相视在功率增益调整寄存器
#define Addr_VAGN_B             0xC0    ///< B 相视在功率增益调整寄存器
#define Addr_VAGN_C             0xC1    ///< C 相视在功率增益调整寄存器
#define Addr_WATTOS_A           0xC2    ///< A 相有功功率偏置调整寄存器
#define Addr_WATTOS_B           0xC3    ///< B 相有功功率偏置调整寄存器
#define Addr_WATTOS_C           0xC4    ///< C 相有功功率偏置调整寄存器
#define Addr_VAROS_A            0xC5    ///< A 相无功功率偏置调整寄存器
#define Addr_VAROS_B            0xC6    ///< B 相无功功率偏置调整寄存器
#define Addr_VAROS_C            0xC7    ///< C 相无功功率偏置调整寄存器
#define Addr_FVAROS_A           0xC8    ///< A 相基波无功功率偏置调整寄存器
#define Addr_FVAROS_B           0xC9    ///< B 相基波无功功率偏置调整寄存器
#define Addr_FVAROS_C           0xCA    ///< C 相基波无功功率偏置调整寄存器
#define Addr_VAOS_A             0xCB    ///< A 相视在功率偏置调整寄存器
#define Addr_VAOS_B             0xCC    ///< B 相视在功率偏置调整寄存器
#define Addr_VAOS_C             0xCD    ///< C 相视在功率偏置调整寄存器
#define Addr_CFDIV              0xCE    ///< 有功 CF 缩放比例寄存器
#define Addr_AT_SEL             0xCF    ///< AT1~3 逻辑输出管脚配置
#define Addr_checksum           0xD0    ///< 校表寄存器校验和

/* 电参数读取选项，可多项或组合 */
#define BL6552_ELECT_PERIOD         ( 1 << 0 )      ///< 读工频
#define BL6552_ELECT_V_RMS          ( 1 << 1 )      ///< 读电压有效值
#define BL6552_ELECT_I_RMS          ( 1 << 2 )      ///< 读电流有效值
#if BL6552_USE_FAST_RMS
#define BL6552_ELECT_I_FAST_RMS     ( 1 << 3 )      ///< 读电流快速有效值
#define BL6552_ELECT_V_FAST_RMS     ( 1 << 4 )      ///< 读电压快速有效值
#endif
#define BL6552_ELECT_WATT           ( 1 << 5 )      ///< 读有功功率
#if BL6552_USE_VAR
#define BL6552_ELECT_VAR            ( 1 << 6 )      ///< 读无功功率
#endif
#if BL6552_USE_VA
#define BL6552_ELECT_VA             ( 1 << 7 )      ///< 读视在功率
#endif
#if BL6552_USE_ANGLE
#define BL6552_ELECT_ANGLE          ( 1 << 8 )      ///< 相波形夹角
#endif
#if BL6552_USE_PF
#define BL6552_ELECT_PF             ( 1 << 9 )      ///< 读功率因子
#endif
#if BL6552_USE_TPS
#define BL6552_ELECT_TPS            ( 1 << 10 )     ///< 读内部温度值
#endif

#define BL6552_ELECT_ALL            0xFFFFFFFF


/**
 * @brief BL6552电参数结构体
 */
typedef struct Bl6552_Elect_s
{
#if BL6552_ELECT_USE_FLOAT  /* 电参数使用浮点运算 */
    FLAOT_UNION IA_RMS;         ///< A 相电流有效值 XX.XXX A 0.001安/LSB
    FLAOT_UNION IB_RMS;         ///< B 相电流有效值
    FLAOT_UNION IC_RMS;         ///< C 相电流有效值
    FLAOT_UNION IN_RMS;         ///< 零线电流有效值
    FLAOT_UNION VA_RMS;         ///< A 相电压有效值 XXX.X V 0.1伏/LSB
    FLAOT_UNION VB_RMS;         ///< B 相电压有效值
    FLAOT_UNION VC_RMS;         ///< C 相电压有效值

    #if BL6552_USE_FAST_RMS
    FLAOT_UNION IA_FAST_RMS;    ///< A 相电流快速有效值 XX.XXX A 0.001安/LSB
    FLAOT_UNION IB_FAST_RMS;    ///< B 相电流快速有效值
    FLAOT_UNION IC_FAST_RMS;    ///< C 相电流快速有效值
    FLAOT_UNION IN_FAST_RMS;    ///< 零线电流快速有效值
    FLAOT_UNION VA_FAST_RMS;    ///< A 相电压快速有效值 XXX.X V 0.1伏/LSB
    FLAOT_UNION VB_FAST_RMS;    ///< B 相电压快速有效值
    FLAOT_UNION VC_FAST_RMS;    ///< C 相电压快速有效值
    #endif

    FLAOT_UNION WATT_A;         ///< A 相有功功率 XXXX.X W 0.1瓦
    FLAOT_UNION WATT_B;         ///< B 相有功功率
    FLAOT_UNION WATT_C;         ///< C 相有功功率
    FLAOT_UNION WATT;           ///< 合相有功功率
    #if BL6552_USE_VAR
    FLAOT_UNION VAR_A;          ///< A 相无功功率
    FLAOT_UNION VAR_B;          ///< B 相无功功率
    FLAOT_UNION VAR_C;          ///< C 相无功功率
    FLAOT_UNION VAR;            ///< 合相无功功率
    #endif
    #if BL6552_USE_VA
    FLAOT_UNION VA_A;           ///< A 相视在功率
    FLAOT_UNION VA_B;           ///< B 相视在功率
    FLAOT_UNION VA_C;           ///< C 相视在功率
    FLAOT_UNION VA;             ///< 合相视在功率
    #endif

    #if BL6552_USE_ANGLE
    FLAOT_UNION ANGLE_AB;       ///< 电压 A 相与电压 B 相的波形夹角 0.1°
    FLAOT_UNION ANGLE_BC;       ///< 电压 B 相与电压 C 相的波形夹角
    FLAOT_UNION ANGLE_AC;       ///< 电压 A 相与电压 C 相的波形夹角
    #endif

    #if BL6552_USE_PF
    FLAOT_UNION PF_A;           ///< A 相功率因子 0.01
    FLAOT_UNION PF_B;           ///< B 相功率因子
    FLAOT_UNION PF_C;           ///< C 相功率因子
    FLAOT_UNION PF;             ///< 合相功率因子
    #endif

    FLAOT_UNION PERIOD;         ///< 线电压频率周期（A相） XX.X Hz 0.1Hz/LSB
    #if BL6552_USE_TPS
    FLAOT_UNION TPS1;           ///< 内部温度值寄存器 XXX.X	℃ 0.1摄氏度
    #endif

#else   /* 电参数使用整形运算 */
    UINT32_UNION IA_RMS;        ///< A 相电流有效值 XX.XXX A 0.001安/LSB
    UINT32_UNION IB_RMS;        ///< B 相电流有效值
    UINT32_UNION IC_RMS;        ///< C 相电流有效值
    UINT32_UNION IN_RMS;        ///< 零线电流有效值
    UINT32_UNION VA_RMS;        ///< A 相电压有效值 XXX.X V 0.1伏/LSB
    UINT32_UNION VB_RMS;        ///< B 相电压有效值
    UINT32_UNION VC_RMS;        ///< C 相电压有效值

    #if BL6552_USE_FAST_RMS
    UINT32_UNION IA_FAST_RMS;   ///< A 相电流快速有效值 XX.XXX A 0.001安/LSB
    UINT32_UNION IB_FAST_RMS;   ///< B 相电流快速有效值
    UINT32_UNION IC_FAST_RMS;   ///< C 相电流快速有效值
    UINT32_UNION IN_FAST_RMS;   ///< 零线电流快速有效值
    UINT32_UNION VA_FAST_RMS;   ///< A 相电压快速有效值 XXX.X V 0.1伏/LSB
    UINT32_UNION VB_FAST_RMS;   ///< B 相电压快速有效值
    UINT32_UNION VC_FAST_RMS;   ///< C 相电压快速有效值
    #endif

    UINT32_UNION WATT_A;        ///< A 相有功功率 XXXX.X W 0.1瓦
    UINT32_UNION WATT_B;        ///< B 相有功功率
    UINT32_UNION WATT_C;        ///< C 相有功功率
    UINT32_UNION WATT;          ///< 合相有功功率
    #if BL6552_USE_VAR
    UINT32_UNION VAR_A;         ///< A 相无功功率
    UINT32_UNION VAR_B;         ///< B 相无功功率
    UINT32_UNION VAR_C;         ///< C 相无功功率
    UINT32_UNION VAR;           ///< 合相无功功率
    #endif
    #if BL6552_USE_VA
    UINT32_UNION VA_A;          ///< A 相视在功率
    UINT32_UNION VA_B;          ///< B 相视在功率
    UINT32_UNION VA_C;          ///< C 相视在功率
    UINT32_UNION VA;            ///< 合相视在功率
    #endif

    #if BL6552_USE_ANGLE
    UINT32_UNION ANGLE_AB;      ///< 电压 A 相与电压 B 相的波形夹角 0.1°
    UINT32_UNION ANGLE_BC;      ///< 电压 B 相与电压 C 相的波形夹角
    UINT32_UNION ANGLE_AC;      ///< 电压 A 相与电压 C 相的波形夹角
    #endif

    #if BL6552_USE_PF
    UINT32_UNION PF_A;          ///< A 相功率因子 0.01
    UINT32_UNION PF_B;          ///< B 相功率因子
    UINT32_UNION PF_C;          ///< C 相功率因子
    UINT32_UNION PF;            ///< 合相功率因子
    #endif

    UINT32_UNION PERIOD;        ///< 线电压频率周期（A相） XX.X Hz 0.1Hz/LSB
    #if BL6552_USE_TPS
    INT16_UNION TPS1;           ///< 内部温度值寄存器 XXX.X	℃ 0.1摄氏度
    #endif

#endif
} Bl6552_Elect_t;

#ifndef BL6552_ENERGY_PERIOD
#define BL6552_ENERGY_PERIOD    10000
#endif

/** @brief 统计电量结构体 */
typedef struct Bl6552_Energy_s
{
#if BL6552_ENERGY_USE_FLOAT
    FLAOT_UNION Energy_A;         ///< A 相有功电量，0.001千瓦小时
    FLAOT_UNION Energy_B;         ///< B 相有功电量.001千瓦小时
    FLAOT_UNION Energy_C;         ///< C 相有功电量.001千瓦小时
    FLAOT_UNION Energy;           ///< 合相有功电量.001千瓦小时
#else
    UINT32_UNION Energy_A;      ///< A 相有功电量，0.001千瓦小时
    UINT32_UNION Energy_B;      ///< B 相有功电量.001千瓦小时
    UINT32_UNION Energy_C;      ///< C 相有功电量.001千瓦小时
    UINT32_UNION Energy;        ///< 合相有功电量.001千瓦小时
#endif
} Bl6552_Energy_t;

#if (!(BL6552_ENERGY_USE_FLOAT && BL6552_CF_CLR_SEL))
/** @brief 统计电量中间变量余数结构体 */
typedef struct Bl6552_EnergyMid_s
{
#if BL6552_ENERGY_USE_FLOAT
    float EnergyMid_A;      ///< A 相有功电量寄存器余数
    float EnergyMid_B;      ///< B 相有功电量寄存器余数
    float EnergyMid_C;      ///< C 相有功电量寄存器余数
    float EnergyMid;        ///< 合相有功电量寄存器余数
#else
    uint32_t EnergyMid_A;   ///< A 相有功电量寄存器余数
    uint32_t EnergyMid_B;   ///< B 相有功电量寄存器余数
    uint32_t EnergyMid_C;   ///< C 相有功电量寄存器余数
    uint32_t EnergyMid;     ///< 合相有功电量寄存器余数
#endif
} Bl6552_EnergyMid_t;
#endif

/**
 * @brief BL6552对象结构体
 */
typedef struct Bl6552_s
{
    UartId_t UartId;        ///< 使用的串口编号
    bool IsInitialized;     ///< 是否初始化

#if BL6552_ELECT_USE_FLOAT
    float I_RMS_K;          ///< 电流有效值转换系数
    float V_RMS_K;          ///< 电压有效值转换系数
    #if BL6552_USE_FAST_RMS
    float I_FAST_RMS_K;     ///< 电流快速有效值转换系数
    float V_FAST_RMS_K;     ///< 电流快速有效值转换系数
    #endif
    float WATT_K;           ///< 有功功率转换系数
#else
    uint32_t I_RMS_K;       ///< 电流有效值转换系数
    uint32_t V_RMS_K;       ///< 电压有效值转换系数
    #if BL6552_USE_FAST_RMS
    uint32_t I_FAST_RMS_K;  ///< 电流快速有效值转换系数
    uint32_t V_FAST_RMS_K;  ///< 电流快速有效值转换系数
    #endif
    uint32_t WATT_K;        ///< 有功功率转换系数
#endif

#if BL6552_ENERGY_USE_FLOAT
    float Energy_K;         ///< 1度电对应的脉冲数
#else
    uint32_t Energy_K;      ///< 1度电对应的脉冲数
#endif


    Bl6552_Energy_t Energy; ///< 实际用电量
#if (!(BL6552_ENERGY_USE_FLOAT && BL6552_CF_CLR_SEL))
    Bl6552_EnergyMid_t EnergyMid;   ///< 电量寄存器余数
#endif

    TimerHandle_t bl_timer; ///< 电量统计计时器
    SemaphoreHandle_t Energy_lock;  ///< 电量读写锁
    SemaphoreHandle_t WR_lock;      ///< 通信锁

    uint8_t resume_times;   ///< 自恢复次数
} Bl6552_t;


/**
 * @brief Bl6552初始化
 * @param  obj         Bl6552对象
 * @param  uartId      串口编号
 * @param  tx          串口TX引脚
 * @param  rx          串口RX引脚
 * @return uint8_t SUCCESS：成功
 */
int8_t Bl6552_Init( Bl6552_t *obj, UartId_t uartId, PinNames tx, PinNames rx );

/**
 * @brief Bl6552去初始化
 * @param  obj         Bl6552对象
 */
void Bl6552_DeInit( Bl6552_t *obj );

/**
 * @brief Bl6552设置电量值
 * @param[in]  obj      Bl6552对象
 * @param[in]  Energy   设置的电量信息结构体
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_NO_INIT - 未初始化
 */
int8_t Bl6552_SetEnergy( Bl6552_t *obj, Bl6552_Energy_t *Energy );

/**
 * @brief Bl6552获取电量值
 * @param[in]  obj      Bl6552对象
 * @param[in]  Energy   统计的电量信息结构体
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_NO_INIT - 未初始化
 */
int8_t Bl6552_GetEnergy( Bl6552_t *obj, Bl6552_Energy_t *Energy );

/**
 * @brief 获取电量瞬时参数
 * @param[in]  obj      Bl6552对象
 * @param[in]  Elect    电参数信息
 * @param[in]  mask     电参数选项掩码
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_NO_INIT - 未初始化
 * - 其他寄存器读取错误
 * @par 示例:
 * @code
 *    Bl6552_GetElect( obj, Elect, BL6552_ELECT_P_ALL );
 *    Bl6552_GetElect( obj, Elect, BL6552_ELECT_V | BL6552_ELECT_I_1 );
 * @endcode
 */
int8_t Bl6552_GetElect( Bl6552_t *obj, Bl6552_Elect_t *Elect, uint32_t mask );


#endif  /* DRV_BL6552_EN */

#endif	 // __BL6552_H 

/*********** (C) COPYRIGHT 2021 FiberHome *****END OF FILE****/
